{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 分类训练"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 机器学习的HelloWorld ，一个新的分类算法，都会看看在MNIST的上的执行结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "b'\\x00\\x00\\x00\\x02'"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import struct\n",
    "struct.pack('>i',2) # 高位字节"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "![jupyter](./g1.png)\n",
    "![jupyter](./g2.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2051, 60000, 28, 28)\n",
      "47040000\n"
     ]
    }
   ],
   "source": [
    "import struct\n",
    "with open('./MNIST_data/train-images-idx3-ubyte', 'rb') as f:\n",
    "    buffer = f.read(4*4) # 4个int 从解码表可以看出有4个列名，占4个int\n",
    "    head = struct.unpack('>iiii',buffer) # 解析出4个int类型\n",
    "    print(head)\n",
    "    length = head[1] * head[2]  * head[3] # 60000张图片，每张图片有28个行，28个列，求总像素\n",
    "    print(length)\n",
    "    buffer = f.read(length)\n",
    "#   print(buffer)\n",
    "    data = struct.unpack('>{}B'.format(length),buffer) #B代表byte"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "47040000"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tuple"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(data) #类型是元组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "imgs = np.reshape(data, (head[1], head[2], head[3])) # np.reshape重新塑形"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000, 28, 28)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "imgs.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "for i in range(5):\n",
    "    plt.imshow(imgs[i], cmap = 'gray') # imshow：专门显示图片的。5张图片，颜色=灰色\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 更加简单的解码方法，下载一个后缀叫mat的数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import fetch_openml\n",
    "mnist = fetch_openml('mnist_784', data_home='./')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'data': array([[0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        ...,\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.]]),\n",
       " 'target': array(['5', '0', '4', ..., '4', '5', '6'], dtype=object),\n",
       " 'frame': None,\n",
       " 'categories': {},\n",
       " 'feature_names': ['pixel1',\n",
       "  'pixel2',\n",
       "  'pixel3',\n",
       "  'pixel4',\n",
       "  'pixel5',\n",
       "  'pixel6',\n",
       "  'pixel7',\n",
       "  'pixel8',\n",
       "  'pixel9',\n",
       "  'pixel10',\n",
       "  'pixel11',\n",
       "  'pixel12',\n",
       "  'pixel13',\n",
       "  'pixel14',\n",
       "  'pixel15',\n",
       "  'pixel16',\n",
       "  'pixel17',\n",
       "  'pixel18',\n",
       "  'pixel19',\n",
       "  'pixel20',\n",
       "  'pixel21',\n",
       "  'pixel22',\n",
       "  'pixel23',\n",
       "  'pixel24',\n",
       "  'pixel25',\n",
       "  'pixel26',\n",
       "  'pixel27',\n",
       "  'pixel28',\n",
       "  'pixel29',\n",
       "  'pixel30',\n",
       "  'pixel31',\n",
       "  'pixel32',\n",
       "  'pixel33',\n",
       "  'pixel34',\n",
       "  'pixel35',\n",
       "  'pixel36',\n",
       "  'pixel37',\n",
       "  'pixel38',\n",
       "  'pixel39',\n",
       "  'pixel40',\n",
       "  'pixel41',\n",
       "  'pixel42',\n",
       "  'pixel43',\n",
       "  'pixel44',\n",
       "  'pixel45',\n",
       "  'pixel46',\n",
       "  'pixel47',\n",
       "  'pixel48',\n",
       "  'pixel49',\n",
       "  'pixel50',\n",
       "  'pixel51',\n",
       "  'pixel52',\n",
       "  'pixel53',\n",
       "  'pixel54',\n",
       "  'pixel55',\n",
       "  'pixel56',\n",
       "  'pixel57',\n",
       "  'pixel58',\n",
       "  'pixel59',\n",
       "  'pixel60',\n",
       "  'pixel61',\n",
       "  'pixel62',\n",
       "  'pixel63',\n",
       "  'pixel64',\n",
       "  'pixel65',\n",
       "  'pixel66',\n",
       "  'pixel67',\n",
       "  'pixel68',\n",
       "  'pixel69',\n",
       "  'pixel70',\n",
       "  'pixel71',\n",
       "  'pixel72',\n",
       "  'pixel73',\n",
       "  'pixel74',\n",
       "  'pixel75',\n",
       "  'pixel76',\n",
       "  'pixel77',\n",
       "  'pixel78',\n",
       "  'pixel79',\n",
       "  'pixel80',\n",
       "  'pixel81',\n",
       "  'pixel82',\n",
       "  'pixel83',\n",
       "  'pixel84',\n",
       "  'pixel85',\n",
       "  'pixel86',\n",
       "  'pixel87',\n",
       "  'pixel88',\n",
       "  'pixel89',\n",
       "  'pixel90',\n",
       "  'pixel91',\n",
       "  'pixel92',\n",
       "  'pixel93',\n",
       "  'pixel94',\n",
       "  'pixel95',\n",
       "  'pixel96',\n",
       "  'pixel97',\n",
       "  'pixel98',\n",
       "  'pixel99',\n",
       "  'pixel100',\n",
       "  'pixel101',\n",
       "  'pixel102',\n",
       "  'pixel103',\n",
       "  'pixel104',\n",
       "  'pixel105',\n",
       "  'pixel106',\n",
       "  'pixel107',\n",
       "  'pixel108',\n",
       "  'pixel109',\n",
       "  'pixel110',\n",
       "  'pixel111',\n",
       "  'pixel112',\n",
       "  'pixel113',\n",
       "  'pixel114',\n",
       "  'pixel115',\n",
       "  'pixel116',\n",
       "  'pixel117',\n",
       "  'pixel118',\n",
       "  'pixel119',\n",
       "  'pixel120',\n",
       "  'pixel121',\n",
       "  'pixel122',\n",
       "  'pixel123',\n",
       "  'pixel124',\n",
       "  'pixel125',\n",
       "  'pixel126',\n",
       "  'pixel127',\n",
       "  'pixel128',\n",
       "  'pixel129',\n",
       "  'pixel130',\n",
       "  'pixel131',\n",
       "  'pixel132',\n",
       "  'pixel133',\n",
       "  'pixel134',\n",
       "  'pixel135',\n",
       "  'pixel136',\n",
       "  'pixel137',\n",
       "  'pixel138',\n",
       "  'pixel139',\n",
       "  'pixel140',\n",
       "  'pixel141',\n",
       "  'pixel142',\n",
       "  'pixel143',\n",
       "  'pixel144',\n",
       "  'pixel145',\n",
       "  'pixel146',\n",
       "  'pixel147',\n",
       "  'pixel148',\n",
       "  'pixel149',\n",
       "  'pixel150',\n",
       "  'pixel151',\n",
       "  'pixel152',\n",
       "  'pixel153',\n",
       "  'pixel154',\n",
       "  'pixel155',\n",
       "  'pixel156',\n",
       "  'pixel157',\n",
       "  'pixel158',\n",
       "  'pixel159',\n",
       "  'pixel160',\n",
       "  'pixel161',\n",
       "  'pixel162',\n",
       "  'pixel163',\n",
       "  'pixel164',\n",
       "  'pixel165',\n",
       "  'pixel166',\n",
       "  'pixel167',\n",
       "  'pixel168',\n",
       "  'pixel169',\n",
       "  'pixel170',\n",
       "  'pixel171',\n",
       "  'pixel172',\n",
       "  'pixel173',\n",
       "  'pixel174',\n",
       "  'pixel175',\n",
       "  'pixel176',\n",
       "  'pixel177',\n",
       "  'pixel178',\n",
       "  'pixel179',\n",
       "  'pixel180',\n",
       "  'pixel181',\n",
       "  'pixel182',\n",
       "  'pixel183',\n",
       "  'pixel184',\n",
       "  'pixel185',\n",
       "  'pixel186',\n",
       "  'pixel187',\n",
       "  'pixel188',\n",
       "  'pixel189',\n",
       "  'pixel190',\n",
       "  'pixel191',\n",
       "  'pixel192',\n",
       "  'pixel193',\n",
       "  'pixel194',\n",
       "  'pixel195',\n",
       "  'pixel196',\n",
       "  'pixel197',\n",
       "  'pixel198',\n",
       "  'pixel199',\n",
       "  'pixel200',\n",
       "  'pixel201',\n",
       "  'pixel202',\n",
       "  'pixel203',\n",
       "  'pixel204',\n",
       "  'pixel205',\n",
       "  'pixel206',\n",
       "  'pixel207',\n",
       "  'pixel208',\n",
       "  'pixel209',\n",
       "  'pixel210',\n",
       "  'pixel211',\n",
       "  'pixel212',\n",
       "  'pixel213',\n",
       "  'pixel214',\n",
       "  'pixel215',\n",
       "  'pixel216',\n",
       "  'pixel217',\n",
       "  'pixel218',\n",
       "  'pixel219',\n",
       "  'pixel220',\n",
       "  'pixel221',\n",
       "  'pixel222',\n",
       "  'pixel223',\n",
       "  'pixel224',\n",
       "  'pixel225',\n",
       "  'pixel226',\n",
       "  'pixel227',\n",
       "  'pixel228',\n",
       "  'pixel229',\n",
       "  'pixel230',\n",
       "  'pixel231',\n",
       "  'pixel232',\n",
       "  'pixel233',\n",
       "  'pixel234',\n",
       "  'pixel235',\n",
       "  'pixel236',\n",
       "  'pixel237',\n",
       "  'pixel238',\n",
       "  'pixel239',\n",
       "  'pixel240',\n",
       "  'pixel241',\n",
       "  'pixel242',\n",
       "  'pixel243',\n",
       "  'pixel244',\n",
       "  'pixel245',\n",
       "  'pixel246',\n",
       "  'pixel247',\n",
       "  'pixel248',\n",
       "  'pixel249',\n",
       "  'pixel250',\n",
       "  'pixel251',\n",
       "  'pixel252',\n",
       "  'pixel253',\n",
       "  'pixel254',\n",
       "  'pixel255',\n",
       "  'pixel256',\n",
       "  'pixel257',\n",
       "  'pixel258',\n",
       "  'pixel259',\n",
       "  'pixel260',\n",
       "  'pixel261',\n",
       "  'pixel262',\n",
       "  'pixel263',\n",
       "  'pixel264',\n",
       "  'pixel265',\n",
       "  'pixel266',\n",
       "  'pixel267',\n",
       "  'pixel268',\n",
       "  'pixel269',\n",
       "  'pixel270',\n",
       "  'pixel271',\n",
       "  'pixel272',\n",
       "  'pixel273',\n",
       "  'pixel274',\n",
       "  'pixel275',\n",
       "  'pixel276',\n",
       "  'pixel277',\n",
       "  'pixel278',\n",
       "  'pixel279',\n",
       "  'pixel280',\n",
       "  'pixel281',\n",
       "  'pixel282',\n",
       "  'pixel283',\n",
       "  'pixel284',\n",
       "  'pixel285',\n",
       "  'pixel286',\n",
       "  'pixel287',\n",
       "  'pixel288',\n",
       "  'pixel289',\n",
       "  'pixel290',\n",
       "  'pixel291',\n",
       "  'pixel292',\n",
       "  'pixel293',\n",
       "  'pixel294',\n",
       "  'pixel295',\n",
       "  'pixel296',\n",
       "  'pixel297',\n",
       "  'pixel298',\n",
       "  'pixel299',\n",
       "  'pixel300',\n",
       "  'pixel301',\n",
       "  'pixel302',\n",
       "  'pixel303',\n",
       "  'pixel304',\n",
       "  'pixel305',\n",
       "  'pixel306',\n",
       "  'pixel307',\n",
       "  'pixel308',\n",
       "  'pixel309',\n",
       "  'pixel310',\n",
       "  'pixel311',\n",
       "  'pixel312',\n",
       "  'pixel313',\n",
       "  'pixel314',\n",
       "  'pixel315',\n",
       "  'pixel316',\n",
       "  'pixel317',\n",
       "  'pixel318',\n",
       "  'pixel319',\n",
       "  'pixel320',\n",
       "  'pixel321',\n",
       "  'pixel322',\n",
       "  'pixel323',\n",
       "  'pixel324',\n",
       "  'pixel325',\n",
       "  'pixel326',\n",
       "  'pixel327',\n",
       "  'pixel328',\n",
       "  'pixel329',\n",
       "  'pixel330',\n",
       "  'pixel331',\n",
       "  'pixel332',\n",
       "  'pixel333',\n",
       "  'pixel334',\n",
       "  'pixel335',\n",
       "  'pixel336',\n",
       "  'pixel337',\n",
       "  'pixel338',\n",
       "  'pixel339',\n",
       "  'pixel340',\n",
       "  'pixel341',\n",
       "  'pixel342',\n",
       "  'pixel343',\n",
       "  'pixel344',\n",
       "  'pixel345',\n",
       "  'pixel346',\n",
       "  'pixel347',\n",
       "  'pixel348',\n",
       "  'pixel349',\n",
       "  'pixel350',\n",
       "  'pixel351',\n",
       "  'pixel352',\n",
       "  'pixel353',\n",
       "  'pixel354',\n",
       "  'pixel355',\n",
       "  'pixel356',\n",
       "  'pixel357',\n",
       "  'pixel358',\n",
       "  'pixel359',\n",
       "  'pixel360',\n",
       "  'pixel361',\n",
       "  'pixel362',\n",
       "  'pixel363',\n",
       "  'pixel364',\n",
       "  'pixel365',\n",
       "  'pixel366',\n",
       "  'pixel367',\n",
       "  'pixel368',\n",
       "  'pixel369',\n",
       "  'pixel370',\n",
       "  'pixel371',\n",
       "  'pixel372',\n",
       "  'pixel373',\n",
       "  'pixel374',\n",
       "  'pixel375',\n",
       "  'pixel376',\n",
       "  'pixel377',\n",
       "  'pixel378',\n",
       "  'pixel379',\n",
       "  'pixel380',\n",
       "  'pixel381',\n",
       "  'pixel382',\n",
       "  'pixel383',\n",
       "  'pixel384',\n",
       "  'pixel385',\n",
       "  'pixel386',\n",
       "  'pixel387',\n",
       "  'pixel388',\n",
       "  'pixel389',\n",
       "  'pixel390',\n",
       "  'pixel391',\n",
       "  'pixel392',\n",
       "  'pixel393',\n",
       "  'pixel394',\n",
       "  'pixel395',\n",
       "  'pixel396',\n",
       "  'pixel397',\n",
       "  'pixel398',\n",
       "  'pixel399',\n",
       "  'pixel400',\n",
       "  'pixel401',\n",
       "  'pixel402',\n",
       "  'pixel403',\n",
       "  'pixel404',\n",
       "  'pixel405',\n",
       "  'pixel406',\n",
       "  'pixel407',\n",
       "  'pixel408',\n",
       "  'pixel409',\n",
       "  'pixel410',\n",
       "  'pixel411',\n",
       "  'pixel412',\n",
       "  'pixel413',\n",
       "  'pixel414',\n",
       "  'pixel415',\n",
       "  'pixel416',\n",
       "  'pixel417',\n",
       "  'pixel418',\n",
       "  'pixel419',\n",
       "  'pixel420',\n",
       "  'pixel421',\n",
       "  'pixel422',\n",
       "  'pixel423',\n",
       "  'pixel424',\n",
       "  'pixel425',\n",
       "  'pixel426',\n",
       "  'pixel427',\n",
       "  'pixel428',\n",
       "  'pixel429',\n",
       "  'pixel430',\n",
       "  'pixel431',\n",
       "  'pixel432',\n",
       "  'pixel433',\n",
       "  'pixel434',\n",
       "  'pixel435',\n",
       "  'pixel436',\n",
       "  'pixel437',\n",
       "  'pixel438',\n",
       "  'pixel439',\n",
       "  'pixel440',\n",
       "  'pixel441',\n",
       "  'pixel442',\n",
       "  'pixel443',\n",
       "  'pixel444',\n",
       "  'pixel445',\n",
       "  'pixel446',\n",
       "  'pixel447',\n",
       "  'pixel448',\n",
       "  'pixel449',\n",
       "  'pixel450',\n",
       "  'pixel451',\n",
       "  'pixel452',\n",
       "  'pixel453',\n",
       "  'pixel454',\n",
       "  'pixel455',\n",
       "  'pixel456',\n",
       "  'pixel457',\n",
       "  'pixel458',\n",
       "  'pixel459',\n",
       "  'pixel460',\n",
       "  'pixel461',\n",
       "  'pixel462',\n",
       "  'pixel463',\n",
       "  'pixel464',\n",
       "  'pixel465',\n",
       "  'pixel466',\n",
       "  'pixel467',\n",
       "  'pixel468',\n",
       "  'pixel469',\n",
       "  'pixel470',\n",
       "  'pixel471',\n",
       "  'pixel472',\n",
       "  'pixel473',\n",
       "  'pixel474',\n",
       "  'pixel475',\n",
       "  'pixel476',\n",
       "  'pixel477',\n",
       "  'pixel478',\n",
       "  'pixel479',\n",
       "  'pixel480',\n",
       "  'pixel481',\n",
       "  'pixel482',\n",
       "  'pixel483',\n",
       "  'pixel484',\n",
       "  'pixel485',\n",
       "  'pixel486',\n",
       "  'pixel487',\n",
       "  'pixel488',\n",
       "  'pixel489',\n",
       "  'pixel490',\n",
       "  'pixel491',\n",
       "  'pixel492',\n",
       "  'pixel493',\n",
       "  'pixel494',\n",
       "  'pixel495',\n",
       "  'pixel496',\n",
       "  'pixel497',\n",
       "  'pixel498',\n",
       "  'pixel499',\n",
       "  'pixel500',\n",
       "  'pixel501',\n",
       "  'pixel502',\n",
       "  'pixel503',\n",
       "  'pixel504',\n",
       "  'pixel505',\n",
       "  'pixel506',\n",
       "  'pixel507',\n",
       "  'pixel508',\n",
       "  'pixel509',\n",
       "  'pixel510',\n",
       "  'pixel511',\n",
       "  'pixel512',\n",
       "  'pixel513',\n",
       "  'pixel514',\n",
       "  'pixel515',\n",
       "  'pixel516',\n",
       "  'pixel517',\n",
       "  'pixel518',\n",
       "  'pixel519',\n",
       "  'pixel520',\n",
       "  'pixel521',\n",
       "  'pixel522',\n",
       "  'pixel523',\n",
       "  'pixel524',\n",
       "  'pixel525',\n",
       "  'pixel526',\n",
       "  'pixel527',\n",
       "  'pixel528',\n",
       "  'pixel529',\n",
       "  'pixel530',\n",
       "  'pixel531',\n",
       "  'pixel532',\n",
       "  'pixel533',\n",
       "  'pixel534',\n",
       "  'pixel535',\n",
       "  'pixel536',\n",
       "  'pixel537',\n",
       "  'pixel538',\n",
       "  'pixel539',\n",
       "  'pixel540',\n",
       "  'pixel541',\n",
       "  'pixel542',\n",
       "  'pixel543',\n",
       "  'pixel544',\n",
       "  'pixel545',\n",
       "  'pixel546',\n",
       "  'pixel547',\n",
       "  'pixel548',\n",
       "  'pixel549',\n",
       "  'pixel550',\n",
       "  'pixel551',\n",
       "  'pixel552',\n",
       "  'pixel553',\n",
       "  'pixel554',\n",
       "  'pixel555',\n",
       "  'pixel556',\n",
       "  'pixel557',\n",
       "  'pixel558',\n",
       "  'pixel559',\n",
       "  'pixel560',\n",
       "  'pixel561',\n",
       "  'pixel562',\n",
       "  'pixel563',\n",
       "  'pixel564',\n",
       "  'pixel565',\n",
       "  'pixel566',\n",
       "  'pixel567',\n",
       "  'pixel568',\n",
       "  'pixel569',\n",
       "  'pixel570',\n",
       "  'pixel571',\n",
       "  'pixel572',\n",
       "  'pixel573',\n",
       "  'pixel574',\n",
       "  'pixel575',\n",
       "  'pixel576',\n",
       "  'pixel577',\n",
       "  'pixel578',\n",
       "  'pixel579',\n",
       "  'pixel580',\n",
       "  'pixel581',\n",
       "  'pixel582',\n",
       "  'pixel583',\n",
       "  'pixel584',\n",
       "  'pixel585',\n",
       "  'pixel586',\n",
       "  'pixel587',\n",
       "  'pixel588',\n",
       "  'pixel589',\n",
       "  'pixel590',\n",
       "  'pixel591',\n",
       "  'pixel592',\n",
       "  'pixel593',\n",
       "  'pixel594',\n",
       "  'pixel595',\n",
       "  'pixel596',\n",
       "  'pixel597',\n",
       "  'pixel598',\n",
       "  'pixel599',\n",
       "  'pixel600',\n",
       "  'pixel601',\n",
       "  'pixel602',\n",
       "  'pixel603',\n",
       "  'pixel604',\n",
       "  'pixel605',\n",
       "  'pixel606',\n",
       "  'pixel607',\n",
       "  'pixel608',\n",
       "  'pixel609',\n",
       "  'pixel610',\n",
       "  'pixel611',\n",
       "  'pixel612',\n",
       "  'pixel613',\n",
       "  'pixel614',\n",
       "  'pixel615',\n",
       "  'pixel616',\n",
       "  'pixel617',\n",
       "  'pixel618',\n",
       "  'pixel619',\n",
       "  'pixel620',\n",
       "  'pixel621',\n",
       "  'pixel622',\n",
       "  'pixel623',\n",
       "  'pixel624',\n",
       "  'pixel625',\n",
       "  'pixel626',\n",
       "  'pixel627',\n",
       "  'pixel628',\n",
       "  'pixel629',\n",
       "  'pixel630',\n",
       "  'pixel631',\n",
       "  'pixel632',\n",
       "  'pixel633',\n",
       "  'pixel634',\n",
       "  'pixel635',\n",
       "  'pixel636',\n",
       "  'pixel637',\n",
       "  'pixel638',\n",
       "  'pixel639',\n",
       "  'pixel640',\n",
       "  'pixel641',\n",
       "  'pixel642',\n",
       "  'pixel643',\n",
       "  'pixel644',\n",
       "  'pixel645',\n",
       "  'pixel646',\n",
       "  'pixel647',\n",
       "  'pixel648',\n",
       "  'pixel649',\n",
       "  'pixel650',\n",
       "  'pixel651',\n",
       "  'pixel652',\n",
       "  'pixel653',\n",
       "  'pixel654',\n",
       "  'pixel655',\n",
       "  'pixel656',\n",
       "  'pixel657',\n",
       "  'pixel658',\n",
       "  'pixel659',\n",
       "  'pixel660',\n",
       "  'pixel661',\n",
       "  'pixel662',\n",
       "  'pixel663',\n",
       "  'pixel664',\n",
       "  'pixel665',\n",
       "  'pixel666',\n",
       "  'pixel667',\n",
       "  'pixel668',\n",
       "  'pixel669',\n",
       "  'pixel670',\n",
       "  'pixel671',\n",
       "  'pixel672',\n",
       "  'pixel673',\n",
       "  'pixel674',\n",
       "  'pixel675',\n",
       "  'pixel676',\n",
       "  'pixel677',\n",
       "  'pixel678',\n",
       "  'pixel679',\n",
       "  'pixel680',\n",
       "  'pixel681',\n",
       "  'pixel682',\n",
       "  'pixel683',\n",
       "  'pixel684',\n",
       "  'pixel685',\n",
       "  'pixel686',\n",
       "  'pixel687',\n",
       "  'pixel688',\n",
       "  'pixel689',\n",
       "  'pixel690',\n",
       "  'pixel691',\n",
       "  'pixel692',\n",
       "  'pixel693',\n",
       "  'pixel694',\n",
       "  'pixel695',\n",
       "  'pixel696',\n",
       "  'pixel697',\n",
       "  'pixel698',\n",
       "  'pixel699',\n",
       "  'pixel700',\n",
       "  'pixel701',\n",
       "  'pixel702',\n",
       "  'pixel703',\n",
       "  'pixel704',\n",
       "  'pixel705',\n",
       "  'pixel706',\n",
       "  'pixel707',\n",
       "  'pixel708',\n",
       "  'pixel709',\n",
       "  'pixel710',\n",
       "  'pixel711',\n",
       "  'pixel712',\n",
       "  'pixel713',\n",
       "  'pixel714',\n",
       "  'pixel715',\n",
       "  'pixel716',\n",
       "  'pixel717',\n",
       "  'pixel718',\n",
       "  'pixel719',\n",
       "  'pixel720',\n",
       "  'pixel721',\n",
       "  'pixel722',\n",
       "  'pixel723',\n",
       "  'pixel724',\n",
       "  'pixel725',\n",
       "  'pixel726',\n",
       "  'pixel727',\n",
       "  'pixel728',\n",
       "  'pixel729',\n",
       "  'pixel730',\n",
       "  'pixel731',\n",
       "  'pixel732',\n",
       "  'pixel733',\n",
       "  'pixel734',\n",
       "  'pixel735',\n",
       "  'pixel736',\n",
       "  'pixel737',\n",
       "  'pixel738',\n",
       "  'pixel739',\n",
       "  'pixel740',\n",
       "  'pixel741',\n",
       "  'pixel742',\n",
       "  'pixel743',\n",
       "  'pixel744',\n",
       "  'pixel745',\n",
       "  'pixel746',\n",
       "  'pixel747',\n",
       "  'pixel748',\n",
       "  'pixel749',\n",
       "  'pixel750',\n",
       "  'pixel751',\n",
       "  'pixel752',\n",
       "  'pixel753',\n",
       "  'pixel754',\n",
       "  'pixel755',\n",
       "  'pixel756',\n",
       "  'pixel757',\n",
       "  'pixel758',\n",
       "  'pixel759',\n",
       "  'pixel760',\n",
       "  'pixel761',\n",
       "  'pixel762',\n",
       "  'pixel763',\n",
       "  'pixel764',\n",
       "  'pixel765',\n",
       "  'pixel766',\n",
       "  'pixel767',\n",
       "  'pixel768',\n",
       "  'pixel769',\n",
       "  'pixel770',\n",
       "  'pixel771',\n",
       "  'pixel772',\n",
       "  'pixel773',\n",
       "  'pixel774',\n",
       "  'pixel775',\n",
       "  'pixel776',\n",
       "  'pixel777',\n",
       "  'pixel778',\n",
       "  'pixel779',\n",
       "  'pixel780',\n",
       "  'pixel781',\n",
       "  'pixel782',\n",
       "  'pixel783',\n",
       "  'pixel784'],\n",
       " 'target_names': ['class'],\n",
       " 'DESCR': \"**Author**: Yann LeCun, Corinna Cortes, Christopher J.C. Burges  \\n**Source**: [MNIST Website](http://yann.lecun.com/exdb/mnist/) - Date unknown  \\n**Please cite**:  \\n\\nThe MNIST database of handwritten digits with 784 features, raw data available at: http://yann.lecun.com/exdb/mnist/. It can be split in a training set of the first 60,000 examples, and a test set of 10,000 examples  \\n\\nIt is a subset of a larger set available from NIST. The digits have been size-normalized and centered in a fixed-size image. It is a good database for people who want to try learning techniques and pattern recognition methods on real-world data while spending minimal efforts on preprocessing and formatting. The original black and white (bilevel) images from NIST were size normalized to fit in a 20x20 pixel box while preserving their aspect ratio. The resulting images contain grey levels as a result of the anti-aliasing technique used by the normalization algorithm. the images were centered in a 28x28 image by computing the center of mass of the pixels, and translating the image so as to position this point at the center of the 28x28 field.  \\n\\nWith some classification methods (particularly template-based methods, such as SVM and K-nearest neighbors), the error rate improves when the digits are centered by bounding box rather than center of mass. If you do this kind of pre-processing, you should report it in your publications. The MNIST database was constructed from NIST's NIST originally designated SD-3 as their training set and SD-1 as their test set. However, SD-3 is much cleaner and easier to recognize than SD-1. The reason for this can be found on the fact that SD-3 was collected among Census Bureau employees, while SD-1 was collected among high-school students. Drawing sensible conclusions from learning experiments requires that the result be independent of the choice of training set and test among the complete set of samples. Therefore it was necessary to build a new database by mixing NIST's datasets.  \\n\\nThe MNIST training set is composed of 30,000 patterns from SD-3 and 30,000 patterns from SD-1. Our test set was composed of 5,000 patterns from SD-3 and 5,000 patterns from SD-1. The 60,000 pattern training set contained examples from approximately 250 writers. We made sure that the sets of writers of the training set and test set were disjoint. SD-1 contains 58,527 digit images written by 500 different writers. In contrast to SD-3, where blocks of data from each writer appeared in sequence, the data in SD-1 is scrambled. Writer identities for SD-1 is available and we used this information to unscramble the writers. We then split SD-1 in two: characters written by the first 250 writers went into our new training set. The remaining 250 writers were placed in our test set. Thus we had two sets with nearly 30,000 examples each. The new training set was completed with enough examples from SD-3, starting at pattern # 0, to make a full set of 60,000 training patterns. Similarly, the new test set was completed with SD-3 examples starting at pattern # 35,000 to make a full set with 60,000 test patterns. Only a subset of 10,000 test images (5,000 from SD-1 and 5,000 from SD-3) is available on this site. The full 60,000 sample training set is available.\\n\\nDownloaded from openml.org.\",\n",
       " 'details': {'id': '554',\n",
       "  'name': 'mnist_784',\n",
       "  'version': '1',\n",
       "  'format': 'ARFF',\n",
       "  'upload_date': '2014-09-29T03:28:38',\n",
       "  'licence': 'Public',\n",
       "  'url': 'https://www.openml.org/data/v1/download/52667/mnist_784.arff',\n",
       "  'file_id': '52667',\n",
       "  'default_target_attribute': 'class',\n",
       "  'tag': ['AzurePilot',\n",
       "   'OpenML-CC18',\n",
       "   'OpenML100',\n",
       "   'study_1',\n",
       "   'study_123',\n",
       "   'study_41',\n",
       "   'study_99',\n",
       "   'vision'],\n",
       "  'visibility': 'public',\n",
       "  'status': 'active',\n",
       "  'processing_date': '2018-10-03 21:23:30',\n",
       "  'md5_checksum': '0298d579eb1b86163de7723944c7e495'},\n",
       " 'url': 'https://www.openml.org/d/554'}"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* DESCR 数据集描述\n",
    "* data 包含一个数组，每个实例为一行，每个特征为一列\n",
    "* target 包含一个带有标签的数组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "X, y = mnist['data'], mnist['target']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000, 784)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape # 70000个数据，784=28行*28列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000,)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [],
   "source": [
    "some_digit = X[36000]\n",
    "some_digit_image = some_digit.reshape(28, 28)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPgAAAD2CAYAAAD720p7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAM90lEQVR4nO3db6hU953H8c8n/oH02hglg9QGNA9sFkmV0Bs0otSFvZg05kGaBxHaxmBBsg0mD/IgWwyECC4SSLvQUBuDaUSqawhYpKlEmxhq9zalI0mbIAm7WbSt28AVrLcGkqp894FTvL16z9x75pyZ8Zv3Cy6eO9+Zc74e5uPvzDln/DkiBCCn63rdAID6EHAgMQIOJEbAgcQIOJDY9Lo3cNNNN8XChQvr3gzwmXbs2LHTEdEY/3jtAV+4cKGazWbdmwE+02yfvNrjpQ/Rbe+0PWz7yfJtAahTqYDb/rqkaRGxQtJ824uqbQtAFcqO4KslvdxafkPSyrFF2xttN203R0ZGOmgPQCfKBnxA0qnW8qikeWOLEbEjIgYjYrDRuOJzP4AuKRvwc5Kuby3P6mA9AGpUNpjHdPmwfKmkE5V0A6BSZS+T/VTSUdvzJd0taXllHQGoTKkRPCJGdelE21uS/jkizlbZFIBqlL7RJSLO6PKZdAB9iJNjQGIEHEiMgAOJEXAgMQIOJEbAgcQIOJAYAQcSI+BAYgQcSIyAA4kRcCAxAg4kRsCBxAg4kBgBBxIj4EBiBBxIjIADiRFwIDECDiRGwIHECDiQGAEHEiPgQGIEHEiMgAOJEXAgMQIOJDblgNuebvsPtt9s/Xy5jsYAdK7M9MFLJO2NiCeqbgZAtcocoi+XdJ/tX9n+ie3Sc4wDqFeZgP9W0lcjYqWkv0j62vgn2N5ou2m7OTIy0mGLAMoqE/DfR8SfW8vvS1o0/gkRsSMiBiNisNFodNQggPLKBHy37aW2p0m6T9LvKu4JQEXKfH7eImmPJEs6EBG/qLYlAFWZcsAj4j1dOpMOTNmFCxcK648++mhhffv27YX1NWvWTFh75ZVXCl87a9aswvq1iBtdgMQIOJAYAQcSI+BAYgQcSIyAA4lxHzmm7OOPPy6sb926dcLagQMHCl97/PjxwrrtwvqhQ4cmrO3Zs6fwtRs3biysX4sYwYHECDiQGAEHEiPgQGIEHEiMgAOJEXAgMa6D4woPPvhgYf3VV18trJ85c6bKdiqzdOnSXrfQdYzgQGIEHEiMgAOJEXAgMQIOJEbAgcQIOJAY18ET+vDDDwvr69evL6wPDw9X2U5XzZ49e8LaokVXTMKTHiM4kBgBBxIj4EBiBBxIjIADiRFwIDECDiTGdfBr1N69eyesPfTQQ4WvPX/+fMXd/KOhoaEJa4cPH+5o3ffee29h/fnnn5+wNnfu3I62fS1iBAcSm1TAbc+zfbS1PMP2z2wP295Qb3sAOtE24LbnSNolaaD10CZJzYhYIWmt7c/X2B+ADkxmBL8o6QFJo63fV0t6ubU8LGlw/Atsb7TdtN0cGRmpok8AJbQNeESMRsTZMQ8NSDrVWh6VNO8qr9kREYMRMdhoNKrpFMCUlTnJdk7S9a3lWSXXAaALyoTzmKSVreWlkk5U1g2ASpW5Dr5L0s9tr5K0WNJvqm0JkvTUU08V1p955pkJa51e5163bl1h/cYbbyysv/XWW6W3/fjjjxfWt23bVlifNm1a6W1nNOkRPCJWt/48KWlI0n9J+peIuFhPawA6VepOtoj4P10+kw6gT3GCDEiMgAOJEXAgMQIOJMbXRXuk6OueUvFlMEn69NNPJ6zdcMMNha/dtGlTYX3JkiWF9SeeeKKwfuLEicJ6kWXLlhXWuQw2NYzgQGIEHEiMgAOJEXAgMQIOJEbAgcQIOJAY18FrcuHChcL6iy++WFgvus7dTrtrxZ988klhvd3XRSNiyj2hNxjBgcQIOJAYAQcSI+BAYgQcSIyAA4kRcCAxroPX5MyZM4X1119/vWfbfvbZZ2vbdjszZ84srC9YsKBLnXw2MIIDiRFwIDECDiRGwIHECDiQGAEHEiPgQGJcB6/JgQMHet1Cabfeemth/YMPPii97qGhocL6HXfcUXrduNKkRnDb82wfbS1/0fafbL/Z+mnU2yKAstqO4LbnSNolaaD10DJJWyNie52NAejcZEbwi5IekDTa+n25pO/Y/rXt79fWGYCOtQ14RIxGxNkxDx2UtCIi7pT0JdtXTGRle6Ptpu3myMhIhe0CmIoyZ9GHI+KvreX3JS0a/4SI2BERgxEx2GjwER3olTIBf832F2x/TtIaSe9V3BOAipS5TPa0pCOS/ibpRxFR/poJgFpNOuARsbr15xFJ/1RXQ1msX7++sL5v377C+pEjRwrrFy9enLA2Y8aMwteuXbu2sN7uOvi2bdsK60UWL15c+rWYOu5kAxIj4EBiBBxIjIADiRFwIDECDiTG10VrMn168a49dOhQYf3tt98urL/77rsT1tpN/9vuvy6+7bbbCuud2LBhQ23rxpUYwYHECDiQGAEHEiPgQGIEHEiMgAOJEXAgMa6D96nbb7+9o3qRLVu2FNaPHz9eet2StHz58glrt9xyS0frxtQwggOJEXAgMQIOJEbAgcQIOJAYAQcSI+BAYlwHT+jUqVOF9eeee67W7T/88MMT1tp9Fx3VYgQHEiPgQGIEHEiMgAOJEXAgMQIOJEbAgcS4Dp7QwYMHC+unT5/uaP2zZ88urN9///0drR/VaTuC255t+6Dtw7b3255pe6ftYdtPdqNJAOVM5hD9G5K+FxFDkj6StE7StIhYIWm+7UV1NgigvLaH6BHxwzG/NiR9U9J/tH5/Q9JKSf9deWcAOjbpk2y275Q0R9IfJf39ZudRSfOu8tyNtpu2myMjI5U0CmDqJhVw23Ml/UDSBknnJF3fKs262joiYkdEDEbEYKPRqKpXAFM0mZNsMyW9LOm7EXFS0jFdOiyXpKWSTtTWHYCOTOYy2bclfUXSZtubJf1Y0rdsz5d0t6SJ/49c1Obo0aMT1h555JFat/3SSy8V1gcGBmrdPiZvMifZtkvaPvYx2wckDUl6JiLO1tQbgA6VutElIs7o0mE7gD7GrapAYgQcSIyAA4kRcCAxAg4kxtdF+9T58+cL6++8807p17azatWqwvo999zT0frRPYzgQGIEHEiMgAOJEXAgMQIOJEbAgcQIOJAY18H7VNH3vSXpscceq23bu3fvLqxPn87b5lrBCA4kRsCBxAg4kBgBBxIj4EBiBBxIjIADiXFBs0/t37+/tnXfddddhfWbb765tm2juxjBgcQIOJAYAQcSI+BAYgQcSIyAA4kRcCAxroP3yM6dOwvrL7zwQul1L1iwoLC+b9++wvp11/HvfhZtA257tqT/bD33nKQHJP2PpP9tPWVTRLxbW4cASpvMP9XfkPS9iBiS9JGkf5O0NyJWt34IN9Cn2gY8In4YEYdbvzYkXZB0n+1f2f6J7SuOAmxvtN203RwZGam4ZQCTNekPW7bvlDRH0mFJX42IlZL+Iulr458bETsiYjAiBhuNRlW9ApiiSZ1ksz1X0g8k3S/po4j4tFV6X9KimnoD0KG2I7jtmZJelvTdiDgpabftpbanSbpP0u9q7hFASY6I4ifY/yrp33U5yEd0aSS3pAMRsbno9YODg9FsNitoFcBEbB+LiMHxj7c9RI+I7ZK2j3v46aoaA1Af7mgAEiPgQGIEHEiMgAOJEXAgMQIOJEbAgcQIOJAYAQcSI+BAYgQcSIyAA4kRcCAxAg4k1vb74B1vwB6RdHLMQzdJOl3rRsujt3Lobeqq7mtBRFzx/6PVHvArNmg3r/bF9H5Ab+XQ29R1qy8O0YHECDiQWC8CvqMH25wseiuH3qauK311/TM4gO7hEB1IjIADiXU14LZ32h62/WQ3t9uO7em2/2D7zdbPl3vdkyTZnmf7aGt5hu2ftfbfhj7r7Yu2/zRm//Vkvirbs20ftH3Y9n7bM/vlPTdBb7W/57oWcNtflzQtIlZImm+7n6Y8WqI+mzHV9hxJuyQNtB7aJKnZ2n9rbX++j3pbJmnrmP3Xqxknx8+Eu079857rySy93RzBV+vSFEiS9IaklV3cdjvL1WbG1B64qEtzsY+2fl+ty/tvWFIvb94Y39tySd+x/Wvb3+9VU1eZCfeb6pP3XJlZeqvQzYAPSDrVWh6VNK+L227nt2ozY2q3RcRoRJwd81Df7L+r9HZQ0oqIuFPSl2wv6VFrkv5hJtw/qk/22d9NZZbeKnQz4OckXd9antXlbbfz+4j4c2u5X2dM7ef9NxwRf20t93T/jZkJd4P6bJ+N660r77lu/oWP6fIh0lJJJ7q47XauhRlT+3n/vWb7C7Y/J2mNpPd60cRVZsLtm33Wq1l6u/lZ86eSjtqeL+luXfrc1i+2SNqjyzOm/qLH/VzNLkk/t71K0mJJv+lxP2M9rUuzzv5N0o8i4oMe9fFtSV+RtNn2Zkk/lvStPnnPje/tiKTdqvk919U72VpnX4ck/TIiPurahpNovVFXSnpt3GdgTOCz/p7jVlUgsX46UQOgYgQcSIyAA4kRcCAxAg4k9v+dM1CkSunRhgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(some_digit_image, cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'9'"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y[36000]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 建立测试集和训练集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([16606,  1557, 39284, ..., 49168, 14611, 51885])"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将数据集合交叉洗牌，交叉验证时，每个子集合数据分布均匀，有些机器学习算法对训练实例的顺序敏感\n",
    "import numpy as np\n",
    "shuffle_index = np.random.permutation(60000)\n",
    "shuffle_index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, y_train = X_train[shuffle_index], y_train[shuffle_index]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       ...,\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.]])"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练一个二元分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False, False, False, ..., False, False, False])"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 识别数字5 ，二元分类5或者非5\n",
    "# 创建目标向量\n",
    "y_train_5 = (y_train == '9')\n",
    "y_train_5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False, False, False, ...,  True, False,  True],\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       [False, False, False, ..., False, False,  True],\n",
       "       ...,\n",
       "       [False,  True, False, ..., False, False, False],\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       [ True, False, False, ..., False, False, False]])"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_5.reshape(20, -1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_5 = (y_test == '9') "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# SGD 梯度下降 分类器， 适合非常大的数据集，独立处理训练集数据，一次一个，适合在线学习，\n",
    "from sklearn.linear_model import SGDClassifier\n",
    "\n",
    "sgd_clf = SGDClassifier(random_state = 42) #建立模型\n",
    "sgd_clf.fit(X_train, y_train_5) # 训练模型\n",
    "\n",
    "sgd_clf.predict([some_digit]) # 模型预测"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 性能考核"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用交叉验证测量精度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.94325, 0.94545, 0.9465 ])"
      ]
     },
     "execution_count": 128,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 评估分类器比评估回归器要困难得多\n",
    "\n",
    "# cv：3个折叠，把训练集分成3份分三次分别拿两个训练，一个测试，正确率达到 95% 以上，\n",
    "from sklearn.model_selection import cross_val_score\n",
    "cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring=\"accuracy\") # sgd_clf为模型名字，scoring=\"accuracy\"准确度评价标准"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 把每张图都分类成 非5\n",
    "from sklearn.base import BaseEstimator\n",
    "class Never5Classifier(BaseEstimator):\n",
    "    def fit(self, X, y=None):\n",
    "        pass\n",
    "    def predict(self, X):\n",
    "        return np.zeros((len(X), 1), dtype=bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False],\n",
       "       [False],\n",
       "       [False],\n",
       "       ...,\n",
       "       [False],\n",
       "       [False],\n",
       "       [False]])"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.zeros((len(X), 1), dtype=bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.9015 , 0.90045, 0.9006 ])"
      ]
     },
     "execution_count": 131,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "never_5_clf = Never5Classifier()\n",
    "cross_val_score(never_5_clf, X_train, y_train_5, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 准确率超过90% ，因为5的图像大约只有10%，你猜一张图不是5， 90%的时间你都是正确的\n",
    "* 这说明准确率无法成为分类器的首要性能指标，特别是当你处理偏科数据集， 某些类比其他类更为频繁"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 混淆矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 评估分类器性能的更好方法是混淆矩阵\n",
    "# A类别实例被分为B类别次数\n",
    "# 想要知道分类器将数字3和数字5混淆多少次，通过混淆矩阵的5行3列\n",
    "from sklearn.model_selection import cross_val_predict\n",
    "\n",
    "y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 与 cross_val_score 相比\n",
    "* 同样执行交叉验证\n",
    "* 返回的不是评估分数，是每个折叠的预测\n",
    "* 每一个实例在模型预测时使用的数据，在训练期间从未见过"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[53252,   799],\n",
       "       [ 2497,  3452]], dtype=int64)"
      ]
     },
     "execution_count": 133,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "confusion_matrix(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 行表示实际类别，列表示预测类别\n",
    "# 第一行 第一列 53272 被正确的分为 非5 ，真负类\n",
    "# 第一行 第二列 1307 被错误的分类成 5 ，假正类\n",
    "# 第二行 第一列 1077 张被错误的分为 非5， 假负类\n",
    "# 第二行 第二列 4344 张被正确的分在了5 ，真正类\n",
    "# 这种衡量方式太复杂，我们可以用更简单的指标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[54051,     0],\n",
       "       [    0,  5949]], dtype=int64)"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_perfect_predictions = y_train_5\n",
    "confusion_matrix(y_train_5, y_train_perfect_predictions)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "\n",
    "## 正类预测的准确率 被称为分类器的精度\n",
    "\n",
    "\n",
    "$\n",
    "\\text{精度} = \\cfrac{TP}{TP + FP}\n",
    "$\n",
    "\n",
    "TP是真正类的数量，FP是假正类的数量\n",
    "\n",
    "\n",
    "\n",
    "$\n",
    "\\text{召回率TPR} = \\cfrac{TP}{TP + FN}\n",
    "$\n",
    "* 检测正类实例的比例\n",
    "FN是假负类的数量\n",
    "![jupyter](./zhaohui.jpg)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 精度和召回率\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8120442248882616"
      ]
     },
     "execution_count": 155,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "precision_score(y_train_5, y_train_pred) # 4327 / （4327 + 1276）精度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.580265590855606"
      ]
     },
     "execution_count": 156,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred)    #  4327 / （4327 + 1094）召回率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 说明 检测一张图的时候，只有90%（precision_score）的概率是准确的，而且只有64%（recall_score）的数字5 被它检测出来\n",
    "# 精度和召回率合成单一指标，成为 F1 分数，谐波平均值\n",
    "# 平均值平等对待所有的值，谐波平均值会给予较低值更高的权重，只有召回率和精度都很高时，才能获得较高的F1分数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$\n",
    "F_1 = \\cfrac{2}{\\cfrac{1}{\\text{precision}} + \\cfrac{1}{\\text{recall}}} = 2 \\times \\cfrac{\\text{precision}\\, \\times \\, \\text{recall}}{\\text{precision}\\, + \\, \\text{recall}} = \\cfrac{TP}{TP + \\cfrac{FN + FP}{2}}\n",
    "$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6768627450980392"
      ]
     },
     "execution_count": 158,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import f1_score\n",
    "f1_score(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 精度precision_score预测正类\n",
    "\n",
    "## 召回率recall_score预测负类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "metadata": {},
   "outputs": [],
   "source": [
    "# F1分数对那些具有相近精度和召回率 分类器更有利，这不一定符合你的期望\n",
    "# 有时候你更关心精度，有时你能关心召回率\n",
    "# 训练一个分类器检测儿童可以放心观看的视频，你可能要求拦截了很多好的视频，低召回率，保留下来的都是安全的视频，高精度\n",
    "# 不能同时增加精度并减少召回率，反之亦然"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 精度/召回率权衡"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "![jupyter](./quanheng.jpg)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* SGDClassifier对每个实例基于决策函数计算一个分值，大于阀值为正类，否则为负类\n",
    "* 中间阀值右侧找到4个真正类 真5 ， 一个假正类 6， 精度为 4/5 80%\n",
    "* 在所有的6个 真正的5 中，分类器找到了4个，召回率为 4/6 67%\n",
    "* 提高阀值，向右移动，精度提高，召回降低\n",
    "* 反之阀值降低，召回提高，精度降低\n",
    "* SKlearn不可以直接设置阀值，可以访问决策分数，\n",
    "* SGDClassifier 默认阀值为0 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 如何设置阀值\n",
    "\n",
    "# 用predict_proba得到每个实例属于正类的概率，然后对概率切一下。以LogisticRegression为例\n",
    "# clf = LogisticRegression() 逻辑回归分类器\n",
    "# clf.fit(X_train, y_train)\n",
    "# pred_proba = clf.predict_proba(X_test)[:, 1]\n",
    "# threshold = 0.75  # 阀值设置为0.75\n",
    "# pred_label = pred_proba > threshold\n",
    "\n",
    "# pred_proba是每个实例为真的概率\n",
    "# 假设阈值是0.75\n",
    "# pred_label里True就是概率大于0.75的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-5915.55755686])"
      ]
     },
     "execution_count": 161,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 返回决策值decision_function\n",
    "y_scores = sgd_clf.decision_function([some_digit])\n",
    "y_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "metadata": {},
   "outputs": [],
   "source": [
    "threshold = 0\n",
    "y_some_digit_pred = (y_scores > threshold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 163,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 164,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 提高阀值可以降低召回率，提高阀值到200000，就错了这个图\n",
    "threshold = 200000\n",
    "y_some_digit_pred = (y_scores > threshold)\n",
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 如何决定使用什么阀值\n",
    "# 通过method=\"decision_function\"返回决策值，而不是预测结果\n",
    "# 使用cross_val_predict交叉预测分数更加稳定\n",
    "y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3,\n",
    "                             method=\"decision_function\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ -7453.00380254, -18304.24687687, -17689.35172553, ...,\n",
       "       -29010.5748254 , -18363.15180501,  -7348.21125279])"
      ]
     },
     "execution_count": 166,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000,)"
      ]
     },
     "execution_count": 167,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 有了y_scores，可以计算所有可能的阀值的精度和召回率\n",
    "y_scores.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import precision_recall_curve\n",
    "# 获得精度，召回，阈值\n",
    "precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\mayn\\venv\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:238: RuntimeWarning: Glyph 8722 missing from current font.\n",
      "  font.set_text(s, 0.0, flags=flags)\n",
      "c:\\users\\mayn\\venv\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:201: RuntimeWarning: Glyph 8722 missing from current font.\n",
      "  font.set_text(s, 0, flags=flags)\n"
     ]
    },
    {
     "data": {
      "image/png": "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0qRKb0eq6vPr16/nnHPOISkpie7duzNlSulkIoHr/Rs2bGDkyJGkpKSQkZHBihUravPfJWVk9sikbVJb1uSsYfr308MdTr3l5npPEzvuuHBHIuIfvkveZlW/pk4tLTd1avVlyzr22KrLlZ2qcdGi+sdfXFzMypUrmTx5MkOGDKFLly4A5OfnM3z4cPbs2cPdd99NmzZtAG/WsfPPP5+NGzfy7rvvcs899/D73/+ev/zlLwAUFBRwxhlnkJOTw/Tp07nvvvt4/PHH+eMf/xh0TBdffDFFRUXMmDGDhx9+mGeeeYbXX389qM8WFhZy5plnkp2dzfTp07n66qu5/vrr+etf/1qu3Nlnn83JJ5/M22+/zfbt27nllluCjk/Ki42JZdKwSQD84fM/NOi5duzwXuefDyeeCG+8Efpz5OXBxo3eS0SCo2vejahnz54H14855hjeeOONg/czz58/n0mTJvHQQ+WvYX766afMnz+f1atX06NkNM/nn3/Oa6+9xpVXXsnrr7/Oxo0bmTt37sFr5zt37mTnzp1Bx7V+/Xouu+wyMjMzATjssMNo165dUJ998803Wb16NatXr6Zjx46cfvrp/Pjjj9x1111ccsklB8udfvrpTJ7sdfdec801PPPMM0HHJ4e6Zsg13Pv5vXyz+RuWZS+jf1r/kBzXOYiJgdRUqOxmiPnzvX1nnhmS0wG6TUykLnyXvIOdXGrixOAfcBBsi/rYY4MrV5V//vOfdO7cmfT0dDp06FBuX1pa2sHkVtbSpUtxzpVL/OB1twN899139O3bt9ygt+uuu65WcV111VXceeedzJkzh+OPP54xY8bQt2/foD67ePFi+vbtezAegMzMTP70pz+RF/itDEws88Vo27atHjhTT8nxyZzf73z+79v/Y9rSadydeXe9j3ngADRr5q1Xdxfj//xP8D+HwdAELSK157tucz/r378/AwcOPCRxB/YlJycfst05R2pqKosXLy73+vDDD6s8T1ZWFvPmzQs6rgceeIC5c+cybNgwPvnkE44++mjeeeedoD9fcTa0wPuy180r/vEh9ffT/j8F4O3lb4dkytRA4m5sanmL1J6Sd4QbMGAAu3btom3btgwaNIhBgwaxfv36g93ORx55JCtWrGDbttJ7fp9++mkuu+yyoI6/d+9ebrjhBrp06cItt9zCJ598wqhRo4KejGXQ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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 使用matplotlib 绘制精度和召回相对于阀值的函数图\n",
    "def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):\n",
    "    plt.plot(thresholds, precisions[:-1], \"b--\", label=\"Precision\", linewidth=2)\n",
    "    plt.plot(thresholds, recalls[:-1], \"g-\", label=\"Recall\", linewidth=2)\n",
    "    plt.xlabel(\"Threshold\", fontsize=16)\n",
    "    plt.legend(loc=\"upper left\", fontsize=16)\n",
    "    plt.ylim([0, 1])\n",
    "\n",
    "plt.figure(figsize=(8, 4))\n",
    "plot_precision_recall_vs_threshold(precisions, recalls, thresholds)\n",
    "plt.xlim([-80000, 80000])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "def plot_precision_vs_recall(precisions, recalls):\n",
    "    plt.plot(recalls, precisions, \"b-\", linewidth=2)\n",
    "    plt.xlabel(\"召回\", fontsize=16)\n",
    "    plt.ylabel(\"精度\", fontsize=16)\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "plot_precision_vs_recall(precisions, recalls)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 通过选择阀值来实现最佳的精度/召回率权衡"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 192,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 目标设定为90%的精度，阀值大概在30000左右 , 设置了阀值为30000\n",
    "y_train_pred_90 = (y_scores > 5000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 193,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.899641577060932"
      ]
     },
     "execution_count": 193,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "precision_score(y_train_5, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 194,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.08438393007228105"
      ]
     },
     "execution_count": 194,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 总结\n",
    "* 获得了一个90%精度的分类器，但如果召回太低，精度再高，也不怎么有用\n",
    "* 如果工作中，需要99%的精度，你应该回应，召回率是多少？"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ROC 曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 195,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 本质是 真正类率tpr和假正类率fpr（错误的分为正类的负类实例比例）\n",
    "# 与召回/精度曲线非常相似"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import roc_curve\n",
    "\n",
    "fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 197,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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lThcibjF9u3bueCCC3j00UcB+O1vf6vAF5GI54rQLywNXKPfsUWqw5WIGyxatIiMjAwWL15MXFyc0+WIiFQbV4T+luwip0sQFygtLeWOO+5g4MCB1KtXj88++4zx48c7XZaISLVxRejHB5fezS0qc7gSiWQrVqzgvvvu48orr2T58uV06tTJ6ZJERKqVKybyFQdX4zu5cYrDlUgkWr16Ne3ateP0008nKyuLjh07Ol2SiEiNcEVPvzz042Nd8eNImBQUFDB+/HhOPfVUli1bBqDAFxFXc0VPPy84rF8n3hU/joTB119/zbBhw/jmm2+49dZb6dq1q9MliYjUOFekZHFZYPZ+grbVlRA8/fTTXH/99aSmprJgwQIGDhzodEkiImHhipTckx+4Pj8+VqukSdWys7M566yzyMrKUuCLSFRxRejvDIZ+qU8b70jlPv74Y+bPnw/AhAkTeOutt2jcuLHDVYmIhJcrQj81MRaAWK8rfhypRj6fj2nTpnHWWWcxadIkrLV4PB48Hv2uiEj0ccVfvpLg7P30OvEOVyK1yaZNmzj77LOZNGkSQ4YMYdGiRdoGV0Simism8u0ODu/HxugPugRs2rSJjIwMCgsLmT17NpdffrkCX0SinitCf1deMQB+ndKPetZajDE0a9aM6667jmHDhnHKKac4XZaISK3giuH9+smBTVHidMleVPvhhx/o06cPq1evxhjDlClTFPgiIhW4IiXLV+Srl6Qd0aKRtZY5c+bQtWtXvv32WzZv3ux0SSIitZIrQv/zDXsBLcMbjXJzcxk1ahRjxowhMzOTL7/8kgEDBjhdlohIreSKlDy+YTIAmqYVff7+978zb948pk6dyqJFi2jevLnTJYmI1FqumMhXElyGt/x6fXE3v9/P1q1badasGbfeeiuDBw+mR48eTpclIlLruaKn/9OOfADiY7QMr9tt376dCy64gDPOOIO8vDzi4+MV+CIiIXJFTz/GYyjzW83ed7lFixYxcuRI9uzZw4wZM0hOTna6JBGRiOKKlEwMbrSTFK+evhuVlZVxxx13MHDgQOrVq8dnn33Gtddeq8V2RESOkCtCvyS40U6c1t53JWMMn3zyCePGjWP58uV06tTJ6ZJERCKSK4b3y/wWCAzzi3v897//pVevXjRp0oT58+eTkJDgdEkiIhHNFV1jn99iDHgV+q5QUFDA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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "def plot_roc_curve(fpr, tpr, label=None):\n",
    "    plt.plot(fpr, tpr, linewidth=2, label=label)\n",
    "    plt.plot([0, 1], [0, 1], 'k--')\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "    plt.xlabel('假正类率', fontsize=16)\n",
    "    plt.ylabel('真正类率', fontsize=16)\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "plot_roc_curve(fpr, tpr)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 198,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9601042855626672"
      ]
     },
     "execution_count": 198,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算曲线下面积AUC，虚线是随机分类0.5到1\n",
    "from sklearn.metrics import roc_auc_score\n",
    "\n",
    "roc_auc_score(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 召回率TPR越高，分类器的假正类FPR就越多\n",
    "* 虚线表示纯随机分类器的ROC曲线，好的分类器应该远离这条线，向左上角\n",
    "* 是使用精度/召回率 PR曲线，还是使用ROC，关键在于 正类非常少或者更关注假正类而不是假负类，选择PR，反之ROC\n",
    "* 例如：前面例子ROC曲线很不错是因为跟负类 非5 相比， 正类 数据5 数量真的很少"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练随机森林分类器，比较SGD分类器的ROC曲线和ROC AUC分数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 获取训练集中每个实例的分数\n",
    "* RandomForestClassifier 没有descision_function(),但是拥有dict_proda()方法，sklearn中分类器都有这两个中的一个\n",
    "* dict_proda返回一个矩阵，每行一个实例，每列代表一个类别的概率，比如这个图片 70%是5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "forest_clf = RandomForestClassifier(n_estimators=10, random_state=42)\n",
    "y_probas_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3,\n",
    "                                    method=\"predict_proba\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.9, 0.1],\n",
       "       [1. , 0. ],\n",
       "       [0.9, 0.1],\n",
       "       ...,\n",
       "       [1. , 0. ],\n",
       "       [1. , 0. ],\n",
       "       [1. , 0. ]])"
      ]
     },
     "execution_count": 182,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_probas_forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 绘制ROC曲线，需要决策值不是概率，直接使用正类的概率作为决策值：\n",
    "y_scores_forest = y_probas_forest[:, 1] #‘：’为所有的行。‘1’为第二列，正类的决策值\n",
    "fpr_forest, tpr_forest, thresholds_forest = roc_curve(y_train_5,y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 184,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.1, 0. , 0.1, ..., 0. , 0. , 0. ])"
      ]
     },
     "execution_count": 184,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores_forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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ev/+/WmPv/zyy7pkyZL6s88+099++62uXLmy7tq1a9rjw4YN06GhoXrlypV61apVumbNmnrAgAFaa62jo6N1RESEnjhxoi5durSOiIjQEREROjo6OsfXltPfIbBT30LNtMQx/V9+AYa4Zl/x8fGMHDmS8PBw+vfvT69evVyzYyGEaSq8strsCAAcnv7gLT0v41Tf4eHhzJ8/HzAafT169KB58+ZUr16d5ORk3n//fbZv306/fv3SnlOjRg3effddAMaMGUO3bt0A4zoiBw8e5Pvvv6dy5cq0b9+e3bt3s2vXLgB++eUX1q5dy+7du6lduzZgTEU+fvx4RowYAUD37t157LHHWLlyJSVLlqRfv34cOnSILVu25Pr1tWrV6rrfDx06RIUKFTh69Cjz58/nyy+/pHPnzgD4+vryxBNPMHbsWMqVK5f2nP379/Pzzz9fNxYrLi6OWbNm8eGHH9KlSxcAzp07x8CBA4mPj8fPz4+jR48SFhbGww8/DEDVqlW5cOECAKGhoYSGhrJ37158fHzyxbgDS3TvN2nsmv3s37+fBg0a8N577/H333+7ZqdCCHGbdu/ezerVq1FKMWrUqLRip5SiS5cufPfddzz44IOULFmSzZs3ExcXd93zBw1Kv3558eLFSU5OBuDgwYMUK1aMypUrpz3evHnz6/ZbtGjRtIIPRpd+bGxs2mdo6dKl07JkvJ8X8+bNY/fu3Wm30NBQAH7//XdsNhstW7a8bv82m409e/Zct43/+7//u2Hw9d9//01CQgL9+vVL65rv168fSUlJHD16FICnn36aDRs20LhxY0aNGkV0dDSNG7uoKN0CS7T0mzZ17va11ixcuJBhw4YREBDA6tWreeCBB5y7UyFEvnGrLez8onbt2tSuXZuHH36YN954g65duwJw5coVwsPDKVGiBD169GD8+PHMnj37hudnd/qbzWbDw+P6tqOnp+d1v2cu4Km/a/txfUeoUqXKdV8sMsuYIbv916tX74bnpa7z+eefU6VKleseS/3i1KlTJ/7880/WrFnDli1b6NixI88++yyzZs26lZfidJZo6Tvbzp07efrpp2nQoAFRUVFS8IUQBdKYMWPYtWsX69atA2DDhg0cOnSI77//nueff56GDRtm2YuZuZCnqly5MufPn09r9YLRpZ+qdu3aXLp0iaioqLRlW7ZsoVChQlSt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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 6))\n",
    "plt.plot(fpr, tpr, \"b:\", linewidth=2, label=\"SGD\")\n",
    "plot_roc_curve(fpr_forest, tpr_forest, \"Random Forest\")\n",
    "plt.legend(loc=\"lower right\", fontsize=16)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9872034467711756"
      ]
     },
     "execution_count": 186,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Rand 比SGD 好很多，ROC AUC的分数也高很多\n",
    "roc_auc_score(y_train_5, y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 187,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9707792207792207"
      ]
     },
     "execution_count": 187,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 再看一下 精度和召回率 也很高\n",
    "y_train_pred_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3)\n",
    "precision_score(y_train_5, y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 188,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8041687678601446"
      ]
     },
     "execution_count": 188,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 总结\n",
    "* 选择合适的指标利用交叉验证来对分类器进行评估\n",
    "* 选择满足需求的精度/召回率权衡\n",
    "* 使用ROC曲线和ROC AUC分数比较多个模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多类别分类器\n",
    "* 尝试5 之外的检测\n",
    "* 多类别分类器 区分两个以上的类别\n",
    "* 随机森里和朴素贝叶斯可以直接处理多个类别\n",
    "* 支持向量机svm和线性分类器只可以处理二元分类器"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 解决方案\n",
    "1. 将数字图片分类0到9，训练10个二元分类器，每个数字一个，检测一张图片时，获取每个分类器的决策分数，哪个最高属于哪个，称为一对多OvA\n",
    "2. 为每一对数字训练一个二元分类器，区分0，1 区分0，2 区分1，2 称为一对一OvO策略，存在N个类别，需要N*（N-1）/2个分类器，最后看哪个类别获胜最多\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 优缺点\n",
    "* OvO 只需要用到部分训练集对其必须区分两个类别进行训练\n",
    "* 对于较小训练集合OvO比较有优势， 大训练集合 OvA 速度快，所以OvA更常用，比如svm 在数据规模扩大时表现糟糕\n",
    "* sklearn 检查到使用二元分类算法进行多类别分类任务，会自动运行OvA，SVM分类器除外"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 200,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['4'], dtype='<U1')"
      ]
     },
     "execution_count": 200,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.fit(X_train, y_train)\n",
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 203,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-22671.99551405, -48589.98051464, -21663.45129627,\n",
       "         -5176.7150891 ,  -5046.70654638,  -7069.36682783,\n",
       "        -30659.47963417,  -8952.667758  ,  -7183.73380416,\n",
       "         -6133.56967167]])"
      ]
     },
     "execution_count": 203,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 内部实际上训练了10个二元分类器，获得图片的决策分数，然后选择了分数最高的类别\n",
    "# 返回10个分数，每个类别1个\n",
    "some_digit_scores = sgd_clf.decision_function([some_digit]) #decision_function决策分数\n",
    "some_digit_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 204,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 204,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.argmax(some_digit_scores) #获取最大值的索引"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 206,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], dtype='<U1')"
      ]
     },
     "execution_count": 206,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 目标类别列表会存储在classes_这个属性中，按值大小排列，返回所有分类标签\n",
    "sgd_clf.classes_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 207,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'4'"
      ]
     },
     "execution_count": 207,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.classes_[np.argmax(some_digit_scores)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 208,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['4'], dtype=object)"
      ]
     },
     "execution_count": 208,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用OvO策略，一对一或者一对多\n",
    "from sklearn.multiclass import OneVsOneClassifier\n",
    "ovo_clf = OneVsOneClassifier(SGDClassifier(max_iter=5, tol=-np.infty, random_state=42))\n",
    "ovo_clf.fit(X_train, y_train)\n",
    "ovo_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 209,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "45"
      ]
     },
     "execution_count": 209,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(ovo_clf.estimators_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 210,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['9'], dtype=object)"
      ]
     },
     "execution_count": 210,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用随机森林\n",
    "forest_clf.fit(X_train, y_train)\n",
    "forest_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 211,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0. , 0.1, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0.9]])"
      ]
     },
     "execution_count": 211,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 随机森林直接将实例分为多个类别，调用predict_proba()可以获得分类器将每个实例分类为每个类别的概率列表\n",
    "forest_clf.predict_proba([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 评估分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 212,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.8663 , 0.88535, 0.8084 ])"
      ]
     },
     "execution_count": 212,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用交叉验证评估SGD的准确率，scoring=\"accuracy\"精度\n",
    "cross_val_score(sgd_clf, X_train, y_train, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 213,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\mayn\\venv\\lib\\site-packages\\sklearn\\linear_model\\_stochastic_gradient.py:573: ConvergenceWarning: Maximum number of iteration reached before convergence. Consider increasing max_iter to improve the fit.\n",
      "  ConvergenceWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([0.90055, 0.8986 , 0.90625])"
      ]
     },
     "execution_count": 213,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将输入进行简单缩放 ，可以得到准确率 90 %以上\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "scaler = StandardScaler()\n",
    "X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))\n",
    "cross_val_score(sgd_clf, X_train_scaled, y_train, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 错误分析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 项目流程\n",
    "1. 探索数据准备的选项\n",
    "2. 尝试多个模型\n",
    "3. 选择最佳模型并用GridSearchCV对参数进行微调\n",
    "4. 尽可能自动化\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 确定了一个相对合适的模型，进一步优化，分析其错误类型\n",
    "* 查看混淆矩阵\n",
    "* 使用cross_val_predict()进行预测\n",
    "* 调用confusion_matrix()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 214,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\mayn\\venv\\lib\\site-packages\\sklearn\\linear_model\\_stochastic_gradient.py:573: ConvergenceWarning: Maximum number of iteration reached before convergence. Consider increasing max_iter to improve the fit.\n",
      "  ConvergenceWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[5595,    0,   17,    8,    8,   42,   36,    4,  212,    1],\n",
       "       [   1, 6424,   39,   21,    4,   44,    5,    7,  188,    9],\n",
       "       [  29,   26, 5234,   90,   72,   23,   74,   42,  358,   10],\n",
       "       [  27,   21,  117, 5254,    2,  211,   26,   46,  364,   63],\n",
       "       [  10,   14,   37,   12, 5247,   10,   40,   20,  310,  142],\n",
       "       [  31,   18,   24,  165,   51, 4509,   77,   18,  465,   63],\n",
       "       [  32,   17,   38,    2,   43,   83, 5568,    6,  128,    1],\n",
       "       [  18,   14,   48,   19,   57,   13,    6, 5719,  178,  193],\n",
       "       [  15,   62,   41,   93,    2,  122,   32,    7, 5436,   41],\n",
       "       [  23,   20,   29,   62,  132,   36,    1,  171,  353, 5122]],\n",
       "      dtype=int64)"
      ]
     },
     "execution_count": 214,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred = cross_val_predict(sgd_clf, X_train_scaled, y_train, cv=3)# 得到预测标签\n",
    "conf_mx = confusion_matrix(y_train, y_train_pred)# 把训练集的标签和预测标签放进去混淆矩阵\n",
    "conf_mx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 216,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPkAAAEACAYAAABxpdD1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKb0lEQVR4nO3dX2jd9RnH8c+nJvHP2mnDnGIRoSoiQ6o01DnWUUXBXYjuHw6kgtsIDtHryoYwLxyIeCNWiX92U/bHm00FdyEbZZVNZkopiHTihVWE4matroLW9Dy7SEalpjm/0/ye88t58n5dpc3pNw+nfed3kp7zxBEhAHWt6XoAALmIHCiOyIHiiBwojsiB4ogcKI7IG7B9ru0/237Z9h9tT3Q9UxO2L7C9r+s5BmF7p+1bup6jCdvrbb9ke4/tJ7ue51Q6idz2M7b/bvuXXXz803CHpEcj4iZJhyTd3PE8TT0i6eyuh2jK9lZJF0bEi13P0tB2SbsiYqukdbanuh5oMUOP3Pb3JZ0REd+SdJHty4c9w6AiYmdEvLzwy/Mlvd/lPE3YvkHSJ5r/pLTi2R6X9JSkt23f2vU8DX0g6Qrb50m6WNI73Y6zuC6u5NskPbfw9l8lfbuDGU6L7eskrY+IV7ueZSkLX048IGlH17MM4E5Jb0h6WNIW2/d2PE8Tr0i6XNJ9kg5I+rDbcRbXReRfkfTewtsfS7qggxkGZntS0mOSftL1LA3skPR4RBzpepABXCNpJiIOSdol6fqO52niIUl3R8SDmo/8ro7nWVQXkR/Via8T13Y0w0AWrozPSbo/Ig52PU8DN0q6x/ZuSVfbfrrjeZp4S9LGhbenJI3C/XyOpKtsnyHpWkkr8oUgHvYLVGzfKenrEfGI7V9J+ldE/HaoQwzI9s81/1l7/8JvPRERf+hwpMZs746IbV3P0Y/tdZKe1fwju3FJP4yI95b+U92yvUXSbyRdIukfkr4XEUe7nerLuoj8q5L2SPqLpO9K+mZEfDTUIYBVZOiRS/P/vyjpJkl/W/gaDECSTiIHMDwr/pteAJaHyIHiOovc9nRXH/t0MXO+UZtXWvkzd3klX9F3zCkwc75Rm1da4TPzcB0ortXvrk9OTsaGDRsa3fbw4cOanJxsdNvXX399OWMBA7Pd+LYRMfDtM0TEokOMtflBNmzYoBdeeKHNIyVJGzdu7H8jLNsg/1BXiqxgzjzzzJRzJenTTz9NO3sxPFwHiiNyoDgiB4ojcqA4IgeKI3KguEaRj+B2VQAL+kY+ittVAZzQ5Eq+TSO6XRVAs8iX3K5qe9r2rO3Zw4cPtz0fgGVqEvmS21UjYiYipiJiqulz0QEMT5PI9+rEQ/RNkt5OmwZA65q8QOVPkvbYvkgL21VTJwLQqr5X8oj4WPPffHtV0vWsTwZGS6OXmkbEhzrxHXYAI4RnvAHFETlQHJEDxRE5UFyrixxtpyzcyvxRTmvW5HyeG8UfP5W1420U74vMHW+fffZZyrmnWuTIlRwojsiB4ogcKI7IgeKIHCiOyIHiiBwojsiB4ogcKI7IgeKIHCiOyIHiiBwojsiB4ogcKI7IgeKIHCiOyIHiiBwojsiB4ogcKI7IgeIa/Sy0QWSs9c1amyxJ+/btSzl38+bNKedKeSuOe71eyrmZf39Z98UormQ+Fa7kQHFEDhRH5EBxRA4UR+RAcUQOFEfkQHFEDhTX98kwts+V9PuF2x6VdHtEHMseDEA7mlzJ75D0aETcJOmQpJtzRwLQpr5X8ojY+YVfni/p/bxxALSt8XPXbV8naX1EvHrS709Lmm57MADtaBS57UlJj0n6wcnvi4gZSTMLt8t5tQCA09b3a3LbE5Kek3R/RBzMHwlAm5p84+2nkjZL+oXt3bZvT54JQIuafOPtCUlPDGEWAAl4MgxQHJEDxRE5UByRA8UROVCc29x2aTsytrVmbeSUpLGx1hfWSpL27t2bcq4kbdq0KeXcs846K+XcYW8nbcO6devSzj569GjrZ/Z6PUXEovFxJQeKI3KgOCIHiiNyoDgiB4ojcqA4IgeKI3KgOCIHiiNyoDgiB4ojcqA4IgeKI3KgOCIHiiNyoDgiB4ojcqA4IgeKI3KgOCIHiiNyoLjWVzK3dtiQZKyQlnLXSO/fvz/l3KxVz1n3sZR3P69duzblXClnRfXc3Jx6vR4rmYHViMiB4ogcKI7IgeKIHCiOyIHiiBworlHkti+wvS97GADta3olf0TS2ZmDAMjRN3LbN0j6RNKh/HEAtG3JyG1PSHpA0o7hjAOgbWN93r9D0uMRceRUzz+2PS1puu3BALSj38P1GyXdY3u3pKttP33yDSJiJiKmImIqY0AAy7PklTwivvP/t23vjoif5Y8EoE2N/588IrYlzgEgCU+GAYojcqA4IgeKI3KgOCIHiiNyoLjWt7VmbObM3HyaZWJiIu3subm5lHOff/75lHNvu+22lHMl6fjx4ynnTk5OppwrSUeOHGn9zF6vp4hgWyuwGhE5UByRA8UROVAckQPFETlQHJEDxRE5UByRA8UROVAckQPFETlQHJEDxRE5UByRA8UROVAckQPFETlQHJEDxRE5UByRA8Wt+m2tGfNKoznzmjU5n/PffPPNlHMl6dJLL005d3x8POVcSfr8889TzmVbK7BKETlQHJEDxRE5UByRA8UROVAckQPFETlQXOPIbe+0fUvmMADa1yhy21slXRgRLybPA6BlfSO3PS7pKUlv2741fyQAbWpyJb9T0huSHpa0xfa9X3yn7Wnbs7ZnMwYEsDxNIr9G0kxEHJK0S9L1X3xnRMxExFRETGUMCGB5mkT+lqSNC29PSTqYNw6Ato01uM0zkp61/WNJ45J+mDsSgDb1jTwi/ivpR0OYBUACngwDFEfkQHFEDhRH5EBxRA4UR+RAca2vZG7tsCEZxZXMWauTe71eyrmZ3n333ZRzL7vsspRzsxw7dky9Xo+VzMBqRORAcUQOFEfkQHFEDhRH5EBxRA4UR+RAcUQOFEfkQHFEDhRH5EBxRA4UR+RAcUQOFEfkQHFEDhRH5EBxRA4UR+RAcUQOFDcS21qztpNKeVtVM2c+fvx4yrljY01+yO3gsuaV8v7+Dhw4kHKuJF155ZWtnxkRigi2tQKrEZEDxRE5UByRA8UROVAckQPFETlQ3JKR215v+yXbe2w/OayhALSn35V8u6RdEbFV0jrbU0OYCUCL+kX+gaQrbJ8n6WJJ76RPBKBV/SJ/RdLlku6TdEDSh+kTAWhVv8gfknR3RDyo+cjvOvkGtqdtz9qezRgQwPL0i/wcSVfZPkPStZK+9GqAiJiJiKmI4Ot1YAXqF/mvJc1I+kjSpKTfpU8EoFVLvrYwIv4p6RtDmgVAAp4MAxRH5EBxRA4UR+RAcUQOFEfkQHFEDhSXs4O3Zb1eL+1se9EttsuWtSpYksbHx1POnZubSzk3876YmJhIOXfLli0p50rSa6+91vqZ27dvP+X7uJIDxRE5UByRA8UROVAckQPFETlQHJEDxRE5UByRA8UROVAckQPFETlQHJEDxRE5UByRA8UROVAckQPFETlQHJEDxRE5UByRA8W5zU2atv8t6WDDm39N0n9a++DDwcz5Rm1eaWXMfElEnL/YO1qNfBC2ZyNiqpMPfpqYOd+ozSut/Jl5uA4UR+RAcV1GPtPhxz5dzJxv1OaVVvjMnX1NDmA4eLgOFEfkQHFEDhRH5EBxRA4U9z9BD0pj02IRSAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 使用matplotlib的matshow 函数来查看混淆矩阵的图像表示\n",
    "plt.matshow(conf_mx, cmap = plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 217,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 看起来不错，大多数图片都在主对角线上，说明它们被正确分类\n",
    "# 数字5 看起来比较暗，说明1. 数字5图片较少  2. 分类器在数字5上执行效果不如其他数字上好\n",
    "# 假设把焦点放在错误上，为取得错误率，而不是错误绝对值，需要将混淆矩阵中每个值除以相应类别中的图片数量\n",
    "\n",
    "row_sums = conf_mx.sum(axis=1, keepdims=True)\n",
    "norm_conf_mx = conf_mx / row_sums"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 218,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPkAAAEACAYAAABxpdD1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAALN0lEQVR4nO3dX2id9R3H8c8nJ432v9F2VkWEighOmbKgdSyjioIDpaxrcVAV3EZwiF5XNoR54UDEG7GVqO1N6TZvNhDshWyEZWxldEi9kE5ErVQs7VpT22qtTb67SLJKTXOepM/vPMm379dV2nP85kvk3Sc5efKLI0IA8upqegEAZRE5kByRA8kROZAckQPJETmQHJFXYHu57V2237L9J9s9Te9Uhe0rbb/d9B4zYXuL7Qea3qMK272237Q9bPvlpvc5n0Yit/2a7X/Y/k0T738WNkl6ISLulXRQ0n0N71PV85IWNr1EVbb7Ja2KiDea3qWihyXtiIh+SUtt9zW90FQ6Hrnt9ZJaEfEDSVfbvqHTO8xURGyJiLcm/rhS0qEm96nC9t2STmr8H6U5z/YCSa9I+sj2uqb3qeiIpBttXybpWkkfN7vO1Jq4kq+V9PrE23+V9MMGdpgV23dK6o2I3U3vMp2JLyeelrS56V1m4BFJ70p6TtLttp9oeJ8q/i7pBklPSton6bNm15laE5EvlvTJxNufS7qygR1mzPblkl6U9POmd6lgs6SXImKk6UVm4DZJgxFxUNIOSXc1vE8Vz0p6LCKe0Xjkjza8z5SaiPyEzn6duKShHWZk4sr4uqSnImJ/0/tUcI+kx20PSbrV9qsN71PF+5JWT7zdJ2k+fJwXSbrFdkvSHZLm5A+CuNM/oGL7EUnfiYjnbf9W0n8iYmdHl5gh27/S+L/aeyf+amtE/LHBlSqzPRQRa5veox3bSyVt0/hndgskbYiIT6b/r5pl+3ZJ2yVdJ+mfkn4SESea3erbmoh8maRhSX+R9GNJayLiWEeXAC4iHY9cGv/+oqR7Jf1t4mswAIU0EjmAzpnzL3oBuDBEDiTXWOS2B5p637PFzuXNt32lub9zk1fyOf2BOQ92Lm++7SvN8Z35dB1IrtZX123Pu5fqbVd+bkRUfv58/K5Fd3d3kbkz+VjM5GMsSaOjo7NZqa2VK1dWfu6XX36phQur/7Df4cOHZ7NSWxEx5QeuzP/VeeSSSy4pMvfMmTNF5pbU29tbZG6pECVpZGSkyNwNGzYUmStJW7duLTZ7Kny6DiRH5EByRA4kR+RAckQOJEfkQHKVIp+Hp6sCmNA28vl4uiqAs6pcyddqnp6uCqBa5NOermp7wPYe23vqXg7AhatyW+u0p6tGxKCkQWl+3rsOZFflSv5vnf0U/XuSPiq2DYDaVbmS/1nSsO2rNXG6atGNANSq7ZU8Ij7X+ItvuyXdxfHJwPxS6UdNI+IznX2FHcA8wh1vQHJEDiRH5EByRA4kd9Gf8TaTA/hm4tSpU0Xmlpw9NjZWZG6pc9ikmR3EOROHDh0qMleSWq1W7TOnO0ePKzmQHJEDyRE5kByRA8kROZAckQPJETmQHJEDyRE5kByRA8kROZAckQPJETmQHJEDyRE5kByRA8kROZAckQPJETmQHJEDyRE5kByRA8k5or5fKd5qtWLJkiW1zZtU547nOn78eJG5N998c5G5UrkjmT/99NMic6+66qoicyXp2LEyv39z27ZtReZK0vr162ufeebMGY2NjU15PjVXciA5IgeSI3IgOSIHkiNyIDkiB5IjciA5IgeSa/v7yW0vl/SHieeekPRgRJwuvRiAelS5km+S9EJE3CvpoKT7yq4EoE5tr+QRseUbf1wp6VC5dQDUrW3kk2zfKak3Inaf8/cDkgYm3q53OwAXrFLkti+X9KKkn577WEQMShqUxn9ApdbtAFywtl+T2+6R9LqkpyJif/mVANSpygtvv5D0fUm/tj1k+8HCOwGoUZUX3rZK2tqBXQAUwM0wQHJEDiRH5EByRA4kR+RAcpXveKuqxMmqo6Ojtc+ctGbNmiJzd+/e3f5Jc8zAwECRuTt37iwyV5IWLVpUZO7Y2FiRuVKZ02sPHjx43se4kgPJETmQHJEDyRE5kByRA8kROZAckQPJETmQHJEDyRE5kByRA8kROZAckQPJETmQHJEDyRE5kByRA8kROZAckQPJETmQHJEDyRE5kFytRzJHhE6dOlXnSElSV1e5f4vee++9InN7enqKzJWk06dPF5m7ffv2InOXL19eZK4knThxosjcI0eOFJkrSTfddFPtM0dGRs77GFdyIDkiB5IjciA5IgeSI3IgOSIHkiNyILlKkdu+0vbbpZcBUL+qV/LnJS0suQiAMtpGbvtuSSclnf+3nAOYs6aN3HaPpKclbe7MOgDq1u7e9c2SXoqIEdtTPsH2gKSBuhcDUI92n67fI+lx20OSbrX96rlPiIjBiOiLiL7z/UMAoDnTXskj4keTb9seiohfll8JQJ0qf588ItYW3ANAIdwMAyRH5EByRA4kR+RAckQOJEfkQHKOiNqGdXd3x7Jly2qbN6nECbCTurtrPbD2/+6///4icyVpeHi4yNwDBw4UmVvidNJJH374YZG5X3zxRZG5knT99dfXPvPAgQP66quvprwbjSs5kByRA8kROZAckQPJETmQHJEDyRE5kByRA8kROZAckQPJETmQHJEDyRE5kByRA8kROZAckQPJETmQHJEDyRE5kByRA8kROZBc7ae1Ll26tLZ5k0qe1rp48eIic48ePVpkriStWLGiyNwrrriiyNx9+/YVmStJrVaryNz+/v4icyVpaGioyNyI4LRW4GJE5EByRA4kR+RAckQOJEfkQHJEDiRH5EBylSO3vcX2AyWXAVC/SpHb7pe0KiLeKLwPgJq1jdz2AkmvSPrI9rryKwGoU5Ur+SOS3pX0nKTbbT/xzQdtD9jeY3vP2NhYiR0BXIAqkd8maTAiDkraIemubz4YEYMR0RcRfV1dvI4HzDVVqnxf0uqJt/sk7S+3DoC6dVd4zmuSttn+maQFkjaUXQlAndpGHhHHJW3swC4ACuCLaCA5IgeSI3IgOSIHkiNyIDkiB5Kr8n3yysbGxoocn1zydtlSR/peeumlReZKUk9PT5G5H3zwQZG5Je+EHB0dLTK31LHXkrRp06baZ+7ateu8j3ElB5IjciA5IgeSI3IgOSIHkiNyIDkiB5IjciA5IgeSI3IgOSIHkiNyIDkiB5IjciA5IgeSI3IgOSIHkiNyIDkiB5IjciA5IgeSc0TUNqyrqytKnCS6atWq2mdOOnnyZJG511xzTZG5kvTOO+8Umdvf319kbql9Jen48eNF5pY6BVYqcxLsyMiIvv76a0/1GFdyIDkiB5IjciA5IgeSI3IgOSIHkiNyILlpI7fda/tN28O2X+7UUgDq0+5K/rCkHRHRL2mp7b4O7ASgRu0iPyLpRtuXSbpW0sfFNwJQq3aR/13SDZKelLRP0mfFNwJQq3aRPyvpsYh4RuORP3ruE2wP2N5je0+d98EDqEe7yBdJusV2S9Idkr5VcUQMRkRfRPTZU94fD6BB7SL/naRBScckXS7p98U3AlCr7ukejIh/Sfpuh3YBUAA3wwDJETmQHJEDyRE5kByRA8kROZAckQPJ1Xokc6vVioULF9Y2b1LJ22W7u6e9VWDWent7i8yVpNWrVxeZu3fv3iJzjx49WmSuJG3cuLHI3IceeqjIXElat25dkbkRwZHMwMWIyIHkiBxIjsiB5IgcSI7IgeSIHEiOyIHkiBxIjsiB5IgcSI7IgeSIHEiOyIHkiBxIjsiB5IgcSI7IgeSIHEiOyIHkiBxIrtbTWm0flrS/4tNXSPpvbe+8M9i5vPm2rzQ3dr4uIlZO9UCtkc+E7T0R0dfIO58ldi5vvu0rzf2d+XQdSI7IgeSajHywwfc9W+xc3nzbV5rjOzf2NTmAzuDTdSA5IgeSI3IgOSIHkiNyILn/AQ8/XrdkxCzNAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 用0填充对角线 只保留错误，重新绘制\n",
    "np.fill_diagonal(norm_conf_mx, 0)# 将矩阵norm_conf_mx对角元素设置为0\n",
    "plt.matshow(norm_conf_mx, cmap=plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 219,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 每行代表实际类别，每列代表预测类别\n",
    "# 8，9列比较亮，说明许多图片被错误的分类为数字8，9\n",
    "# 类别8，9行也偏亮，说明数字8和9经常会跟其他数字混淆\n",
    "# 有些很暗，比如行1，大多数数字1都被正确的分类，一些和8混淆\n",
    "# 5和8是错误最多的"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 结论\n",
    "* 改进数字8和9的分类\n",
    "* 修正数字8和5的混淆\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 如何优化分类器\n",
    "* 尝试多收集这些数字的训练集\n",
    "* 开发一些新特征来改进分类器\n",
    "* 优化分类器算法\n",
    "* 使用pillow或opencv对图片预处理，让显示模型更突出\n",
    "* 分析单个错误"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_digits(instances, images_per_row=10, **options):\n",
    "    size = 28\n",
    "    images_per_row = min(len(instances), images_per_row)\n",
    "    images = [instance.reshape(size,size) for instance in instances]\n",
    "    n_rows = (len(instances) - 1) // images_per_row + 1\n",
    "    row_images = []\n",
    "    n_empty = n_rows * images_per_row - len(instances)\n",
    "    images.append(np.zeros((size, size * n_empty)))\n",
    "    for row in range(n_rows):\n",
    "        rimages = images[row * images_per_row : (row + 1) * images_per_row]\n",
    "        row_images.append(np.concatenate(rimages, axis=1))\n",
    "    image = np.concatenate(row_images, axis=0)\n",
    "    plt.imshow(image, cmap = matplotlib.cm.binary, **options)\n",
    "    plt.axis(\"off\")\n",
    "\n",
    "\n",
    "# 查看数字3和数字5的例子\n",
    "cl_a, cl_b = 3, 5\n",
    "X_aa = X_train[(y_train == cl_a) & (y_train_pred == cl_a)]\n",
    "X_ab = X_train[(y_train == cl_a) & (y_train_pred == cl_b)]\n",
    "X_ba = X_train[(y_train == cl_b) & (y_train_pred == cl_a)]\n",
    "X_bb = X_train[(y_train == cl_b) & (y_train_pred == cl_b)]\n",
    "\n",
    "plt.figure(figsize=(8,8))\n",
    "plt.subplot(221); \n",
    "plot_digits(X_aa[:25], images_per_row=5)\n",
    "plt.subplot(222); \n",
    "plot_digits(X_ab[:25], images_per_row=5)\n",
    "plt.subplot(223);\n",
    "plot_digits(X_ba[:25], images_per_row=5)\n",
    "plt.subplot(224); \n",
    "plot_digits(X_bb[:25], images_per_row=5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 左侧两个是被分类为3的图片\n",
    "# 右侧两个是被分类为5的图片\n",
    "# 大多数错误分类的图片看起来还是非常明显的错误\n",
    "# 原因：SGD是一个线性模型，它所做就是为每个像素分配一个各个类别的权重，当它看到新的图像，将加权后的像素强度汇总，从而得到一个分数进行分类\n",
    "# 数字3和5在一部分像素位上有区别，所以分类器很容易将其弄混\n",
    "# 通过上面图像，如果书写3 的连接点左移，分类器可能将其分类为数字5，这个分类器对图像位移和旋转敏感\n",
    "# 减少混淆的方法之一，就是对图像进行预处理，确保位于中心位置并且没有旋转"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多标签分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 为每个实例产生多个类别 ，例如 照片识别多个人脸\n",
    "# 分类器经过训练可以识别小红，小白，小军，一张照片 里有 小红，小白\n",
    "# 经过分类器，应该输出[1,1,0]， 是小红，是小白，不是小军\n",
    "# 输出多个二元标签的分类系统称为多标签分类系统"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 223,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier()"
      ]
     },
     "execution_count": 223,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "y_train_large = (y_train.astype('int') >= 7)\n",
    "y_train_odd = (y_train.astype('int') % 2 == 1) #奇数\n",
    "y_multilabel = np.c_[y_train_large, y_train_odd] #两组数据合并\n",
    "\n",
    "knn_clf = KNeighborsClassifier()\n",
    "knn_clf.fit(X_train, y_multilabel)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 224,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ True,  True]])"
      ]
     },
     "execution_count": 224,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# knn支持多标签分类，不是所有的分类器都支持\n",
    "knn_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 225,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.97709"
      ]
     },
     "execution_count": 225,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# # 评估多标签分类器方法很多，方法之一就是测量每个标签的F1分数，或者其他二元分类器指标，然后简单平均\n",
    "# y_train_knn_pred = cross_val_predict(knn_clf, X_train, y_multilabel, cv=3)\n",
    "# f1_score(y_multilabel, y_train_knn_pred, average=\"macro\")\n",
    "0.977090"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 226,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 上面假设了所有标签都同等重要，也可以给每个标签设置一个权重（该目标标签实例的数量），设置average='weighted'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多输出分类"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 例子：构建一个系统去除图片中的噪声，输入一张有噪声的图片，它将输入一张干净的数字图片，分类器输出是多个标签，一个像素一个标签，每个标签多个值0到255"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 227,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 增加噪声，目标将图片还原为原始图片 创建训练集和测试集\n",
    "noise = np.random.randint(0, 100, (len(X_train), 784))\n",
    "X_train_mod = X_train + noise\n",
    "noise = np.random.randint(0, 100, (len(X_test), 784))\n",
    "X_test_mod = X_test + noise\n",
    "y_train_mod = X_train\n",
    "y_test_mod = X_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 228,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "some_index = 5500\n",
    "plt.subplot(121);plt.imshow(X_test_mod[some_index].reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.subplot(122);plt.imshow(y_test_mod[some_index].reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 229,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn_clf.fit(X_train_mod, y_train_mod)\n",
    "clean_digit = knn_clf.predict([X_test_mod[some_index]])\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 230,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(clean_digit.reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
